package br.com.guiav6.sisguia.component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import javax.faces.event.ActionEvent;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.guiav6.sisguia.bean.AnuncioBean;
import br.com.guiav6.sisguia.bean.ServicoEspecialidadeBean;
import br.com.guiav6.sisguia.entity.Bloco;
import br.com.guiav6.sisguia.entity.Empresa;
import br.com.guiav6.sisguia.entity.Especialidade;
import br.com.guiav6.sisguia.entity.TipoServico;
import br.com.guiav6.sisguia.entity.TipoServicoEmpresa;
import br.com.guiav6.sisguia.service.AnuncioService;
import br.com.guiav6.sisguia.service.BlocoService;
import br.com.guiav6.sisguia.service.ComboService;
import br.com.guiav6.sisguia.service.EmpresaService;
import br.com.guiav6.sisguia.service.TipoServicoService;

@Component("anuncioAction")
@Scope(value = "session")
public class AnuncioAction extends Action{
	
	private Empresa empresa;
	
	private String servico;
	
	private String[] cartesiano;
	
	private List<Empresa> empresaList;
	
	private List<ServicoEspecialidadeBean> servicoEspecialidadeList;
	
	private List<AnuncioBean> anuncioList = new ArrayList<AnuncioBean>();
	
	private List<Empresa> empresaBlocoList = new ArrayList<Empresa>();
	
	private Map<String, String[]> blocoMap = new TreeMap<String, String[]>();
	
	private AnuncioBean anuncioPesquisaBean;
	
	@Autowired(required = true)
	AnuncioService anuncioService;
	
	@Autowired(required = true)
	EmpresaService empresaService;
	
	@Autowired(required = true)
	BlocoService blocoService;
	
	@Autowired
	TipoServicoService tipoServicoService;
	
	@Autowired(required = true)
	ComboService comboService;
	
	public String pesquisar(){
		if(anuncioPesquisaBean != null){
			empresaList = anuncioService.pesquisar(anuncioPesquisaBean, Integer.valueOf(getParameter("idBairro")));
			if (empresaList.isEmpty()){
				addWarnMessage(null, "pesquisa.vazia");
				return navigate("");
			}else{
				return navigate("lista.pesquisa.empresa");				
			}
		}else{
			addWarnMessage(null, "termo.pesquisa.vazio");
			return navigate("");
		}
	}
	
	public String detalharAnuncio(){
		boolean indServicoExistente = false;
		int index = 0;
		Long idEmpresa = Long.valueOf(getParameter("idEmpresa"));
		servicoEspecialidadeList = new ArrayList<ServicoEspecialidadeBean>();
		empresa = empresaService.findById(idEmpresa);
		for(TipoServicoEmpresa tse: empresa.getTipoServicoEmpresaList()){
			for(int i = 0; i < servicoEspecialidadeList.size(); i++){
				if(tse.getTipoServico().getId() == servicoEspecialidadeList.get(i).getIdServico()){
					indServicoExistente = true;
					index = i;
					break;
				}
			}
			if(indServicoExistente){
				servicoEspecialidadeList.get(index).getEspecialidades().add(tse.getEspecialidade().getNome());
				indServicoExistente = false;
			}else{
				ServicoEspecialidadeBean bean = new ServicoEspecialidadeBean();
				bean.setIdServico(tse.getTipoServico().getId());
				bean.setServico(tse.getTipoServico().getNome());
				if(tse.getEspecialidade() != null)
					bean.getEspecialidades().add(tse.getEspecialidade().getNome());
				servicoEspecialidadeList.add(bean);
			}
		}
		
		List<Bloco> blocos = blocoService.getPosicaoBlocos(empresa.getEndereco().getCep());
		
		for(Bloco bloco: blocos){
			String[] cartesiano = new String[2];
			String[] posicao = bloco.getPosicao().split(",");
			Integer top = (Integer.valueOf(posicao[0]) / Integer.valueOf(51));
			Integer left = (Integer.valueOf(posicao[0]) - (top * Integer.valueOf(50))) - Integer.valueOf(1);
			cartesiano[0] = String.valueOf(top * Integer.valueOf(10));
			cartesiano[1] = String.valueOf(left * Integer.valueOf(10));
			//blocoMap.put(bloco.getPk().getLetra(), cartesiano);
			//if(bloco.getPk().getLetra().equalsIgnoreCase(empresa.getEndereco().getBloco()))
				//empresa.setPathMapa(bloco.getPk().getCep().getPathMapa());
		}

		return navigate("detalhar.anuncio.empresa");
	}
	
	public List<AnuncioBean> completeServicoEspecialidade(String termo){
		List<AnuncioBean> suggestions = new ArrayList<AnuncioBean>();
		if(anuncioList.isEmpty())
			anuncioList = carregarServicoEspecialidade();
		for(AnuncioBean bean: anuncioList){
			if(bean.getServico().toLowerCase().startsWith(termo.toLowerCase()))
				suggestions.add(bean);
		}
		return suggestions;
	}

	private List<AnuncioBean> carregarServicoEspecialidade() {
		List<AnuncioBean> lista = new ArrayList<AnuncioBean>();
		List<TipoServico> servicos = tipoServicoService.findAll();
		for(TipoServico servico: servicos){
			AnuncioBean beanServico = new AnuncioBean();
			beanServico.setServico(servico.getNome());
			beanServico.setIdServico(servico.getId());
			beanServico.setTermoCombinado(servico.getNome());
			lista.add(beanServico);
			for(Especialidade espec: servico.getEspecialidadeList()){
				AnuncioBean beanEspec = new AnuncioBean();
				beanEspec.setServico(servico.getNome());
				beanEspec.setIdServico(servico.getId());
				beanEspec.setIdEspecialidade(espec.getId());
				beanEspec.setEspecialidade(espec.getNome());
				beanEspec.setTermoCombinado(servico.getNome() + " - " + espec.getNome());
				lista.add(beanEspec);
			}
		}
		return lista;
	}
	
	public void findEmpresasByBloco(ActionEvent evt){
		empresaBlocoList = empresaService.findEmpresasByBloco(getParameter("bloco"), empresa.getEndereco().getCep());
	}

	public Empresa getEmpresa() {
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	public String getServico() {
		return servico;
	}

	public void setServico(String servico) {
		this.servico = servico;
	}

	public String[] getCartesiano() {
		return cartesiano;
	}

	public List<Empresa> getEmpresaList() {
		return empresaList;
	}

	public void setEmpresaList(List<Empresa> empresaList) {
		this.empresaList = empresaList;
	}

	public List<ServicoEspecialidadeBean> getServicoEspecialidadeList() {
		return servicoEspecialidadeList;
	}

	public void setServicoEspecialidadeList(
			List<ServicoEspecialidadeBean> servicoEspecialidadeList) {
		this.servicoEspecialidadeList = servicoEspecialidadeList;
	}

	public List<Empresa> getEmpresaBlocoList() {
		return empresaBlocoList;
	}

	public Map<String, String[]> getBlocoMap() {
		return blocoMap;
	}

	public AnuncioBean getAnuncioPesquisaBean() {
		return anuncioPesquisaBean;
	}

	public void setAnuncioPesquisaBean(AnuncioBean anuncioPesquisaBean) {
		this.anuncioPesquisaBean = anuncioPesquisaBean;
	}

}